package ar.fi.uba.celdas.correccion.planificacion.heuristicas;

import java.util.Collection;

import ar.fi.uba.celdas.correccion.planificacion.HeuristicaPlanificacion;
import ar.fi.uba.celdas.correccion.planificacion.HeuristicaPlanificacionType;
import ar.fi.uba.celdas.interfaces.bc.IBaseConocimientos;
import ar.fi.uba.celdas.interfaces.bc.Regla;
import ar.fi.uba.celdas.interfaces.bc.Sensor;

public class Inclusion extends HeuristicaPlanificacion {

	public Inclusion() {
		super(HeuristicaPlanificacionType.INCLUSION);
	}

	@Override
	public void corregirRegla(Regla original, IBaseConocimientos bc) {
		if (bc == null || original == null) {
			return;
		}

		// Descripcion de la situacion.
		Collection<Sensor> situacionInicial = bc.getEstadoAnterior();

		// Descripcion de la situacion siguiente a aplicar la teoria.
		Collection<Sensor> situacionSiguiente = bc.getEstadoActual();

		// Condiciones de la Teoria a rectificar.
		Collection<Sensor> condiciones = original.getCondiciones();

		// Predicciones de la Teoria a rectificar.
		Collection<Sensor> efectos = original.getPredicciones();

		// Incluyo en las condiciones supuestas de la teoria, los elementos de
		// la descripcion de las situaciones en la cual la teoria fue aplicada y
		// produjeron exito.
		if (verificarCondiciones(situacionInicial, condiciones) && !verificarPredicciones(situacionSiguiente, efectos)) {
			for (Sensor sensor : situacionInicial) {
				if (!condiciones.contains(sensor)) {
					condiciones.add(sensor);
				}
			}
		}
	}
}